﻿using ExcellentProjectPlus.Dominio.Cuestionarios.Entidades;
using ExcellentProjectPlus.Dominio.Cuestionarios.Repositorios;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ExcellentProjectPlus.Dominio.Core;

namespace ExcellentProjectPlus.Dominio.Cuestionarios.Servicios.Cuestionarios
{
    public class ServicioDeAdministracionDeCuestionarios : IServicioDeAdministracionDeCuestionarios
    {
        #region Atributos
        IUnidadDeTrabajoCuestionarios _unidadDeTrabajo;
        #endregion

        #region Constructores
        public ServicioDeAdministracionDeCuestionarios(IUnidadDeTrabajoCuestionarios unidadDeTrabajo)
        {
            _unidadDeTrabajo = unidadDeTrabajo;
        }
        #endregion

        public IEnumerable<Cuestionario> ObtenerCuestionarios()
        {
            return _unidadDeTrabajo.RepositorioCuestionarios.Obtener();
        }

        public Cuestionario ObtenerCuestionarioPorId(int id)
        {
            return _unidadDeTrabajo.RepositorioCuestionarios.ObtenerPorId(id);
        }

        public void AgregarCuestionario(Cuestionario cuestionario)
        {
            _unidadDeTrabajo.RepositorioCuestionarios.Agregar(cuestionario);
            _unidadDeTrabajo.Confirmar();
        }

        public void ModificarCuestionario(Cuestionario cuestionario)
        {
            _unidadDeTrabajo.RepositorioCuestionarios.Modificar(cuestionario);
            _unidadDeTrabajo.Confirmar();
        }

        public void EliminarCuestionario(Cuestionario cuestionario)
        {
            _unidadDeTrabajo.RepositorioCuestionarios.Eliminar(cuestionario);
            _unidadDeTrabajo.Confirmar();
        }
        public IEnumerable<Cuestionario> ObtenerCuestionariosPaginado(int pagina, int tamanio)
        {
            return _unidadDeTrabajo.RepositorioCuestionarios.Obtener(orderBy: ct => ct.OrderBy(cuest => cuest.IdCuestionario),
                page: pagina, pageSize: tamanio);
        }

        public object ObtenerCuestionarioParaExamen(int id)
        {
            var cuestionario = _unidadDeTrabajo.RepositorioCuestionarios.Obtener(c => c.IdCuestionario == id, includeProperties: "PreguntaCuestionarios").FirstOrDefault();

            var preguntas = new List<Pregunta>();
            Pregunta p = null;
            var listaPreguntas = cuestionario.PreguntaCuestionarios.ToList();
            foreach (var item in listaPreguntas)
            {
                p = _unidadDeTrabajo.RepositorioPreguntas
                    .ObtenerPreguntaConOpciones(item.IdPregunta).FirstOrDefault();
                if (p != null)
                {
                    p.PreguntaCuestionarios = null;
                    preguntas.Add(p);
                }
            }

            //Generacion de aletoriedad para el cuestionario
            preguntas.Shuffle();

            return new
            {
                Cuestionario = new
                {
                    CalificacionMaxima = cuestionario.CalificacionMaxima,
                    CalificacionMinima = cuestionario.CalificacionMinima,
                    CodigoArea = cuestionario.CodigoArea,
                    Descripcion = cuestionario.Descripcion,
                    Estado = cuestionario.Estado,
                    FechaCreacion = cuestionario.FechaCreacion,
                    IdCuestionario = cuestionario.IdCuestionario,
                    IdDocente = cuestionario.IdDocente,
                    NumeroPreguntas = cuestionario.NumeroPreguntas
                },
                Preguntas = preguntas
            };
        }
    }
}
